package com.ble.utlis;

import android.graphics.Color;
import android.util.Log;

import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.AxisBase;
import com.github.mikephil.charting.components.Description;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.formatter.IAxisValueFormatter;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class LineChartHandle {


    private Random mRandom = new Random(); // 随机产生点
    private DecimalFormat mDecimalFormat = new DecimalFormat("#.00");   // 格式化浮点数位两位小数


    LineChart mLineChart; // 折线表，存线集合
    LineData mLineData; // 线集合，所有折现以数组的形式存到此集合中
    XAxis mXAxis; //X轴
    YAxis mLeftYAxis; //左侧Y轴
    YAxis mRightYAxis; //右侧Y轴
    Legend mLegend; //图例


    int bl=1;

    public void setBl(int _bl){
        bl=_bl;
    }

    float ybl=1;

    public void setYBl(float _ybl){
        ybl=_ybl;
    }

    int max=300;
    public void setMax(int _max){
        max=_max;
    }

    //  Y值数据链表
    List<Float> mList1 = new ArrayList<>();

    // Chart需要的点数据链表
    List<Entry> mEntries1 = new ArrayList<>();

    // LineDataSet:点集合,即一条线
    LineDataSet mLineDataSet1 = new LineDataSet(mEntries1, "折线1");

    // 折线编号
    public static final int LINE_NUMBER_1 = 0;

    /**
     * 功能：产生随机数（小数点两位）
     */
    public Float getRandom(Float seed) {
        return Float.valueOf(mDecimalFormat.format(mRandom.nextFloat() * seed));
    }


    public void clear() {
        Log.e("TAG", "clear: "+mLineData.getDataSetByIndex(0).getEntryCount() );
        try {
            mLineData.getDataSetByIndex(0).clear();
            mLineChart.invalidate(); // 刷新图表以显示更改
        }catch (Exception e ){
            e.printStackTrace();
        }
    }

    boolean falg = true;

    /**
     * 功能：初始化LineChart
     */
    public void initLineChart(LineChart lineChart) {
        mLineChart = lineChart;

        mXAxis = mLineChart.getXAxis(); // 得到x轴
        mLeftYAxis = mLineChart.getAxisLeft(); // 得到侧Y轴
        mRightYAxis = mLineChart.getAxisRight(); // 得到右侧Y轴
        mLegend = mLineChart.getLegend(); // 得到图例
        mLineChart.setGridBackgroundColor(Color.parseColor("#3092D1"));
        mLineChart.setDrawGridBackground(true);
        mLineChart.setBorderColor(Color.parseColor("#3092D1"));
        mLineData = new LineData();
        mLineChart.setData(mLineData);


        // 设置图标基本属性
        setChartBasicAttr(mLineChart);

        // 设置XY轴
        setXYAxis(mLineChart, mXAxis, mLeftYAxis, mRightYAxis);

        // 添加线条
        initLine();


        createLegend(mLegend);

        setMarkerView(mLineChart);

    }


    /**
     * 功能：设置图标的基本属性
     */
    void setChartBasicAttr(LineChart lineChart) {
        /***图表设置***/
        lineChart.setDrawGridBackground(false); //是否展示网格线
        lineChart.setDrawBorders(true); //是否显示边界
        lineChart.setDragEnabled(false); //是否可以拖动
        lineChart.setScaleEnabled(false); // 是否可以缩放
        lineChart.setTouchEnabled(false); //是否有触摸事件
        //设置XY轴动画效果
        //lineChart.animateY(2500);
        lineChart.animateX(10);
    }


    int xNum = 250;

    /**
     * 功能：设置XY轴
     */
    void setXYAxis(LineChart lineChart, XAxis xAxis, YAxis leftYAxis, YAxis rightYAxis) {
        /***XY轴的设置***/
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); //X轴设置显示位置在底部
        xAxis.setAxisMinimum(0f); // 设置X轴的最小值
        xAxis.setAxisMaximum(Integer.MAX_VALUE); // 设置X轴的最大值
        xAxis.setLabelCount(10); // 设置X轴的刻度数量，第二个参数表示是否平均分配
        xAxis.setGranularity(1f); // 设置X轴坐标之间的最小间隔

        xAxis.setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
                return (Integer.valueOf((int) value)*bl)+"";
            }
        });

        lineChart.setVisibleXRangeMaximum(xNum);// 当前统计图表中最多在x轴坐标线上显示的总量

        //保证Y轴从0开始，不然会上移一点
        leftYAxis.setAxisMinimum(0);
        leftYAxis.setAxisMaximum(max);
     //   lineChart.setVisibleYRangeMaximum(820, YAxis.AxisDependency.LEFT);// 当前统计图表中最多在Y轴坐标线上显示的总量
       leftYAxis.setEnabled(true);
        leftYAxis.setLabelCount(5);
        leftYAxis.setTextSize(14);
        leftYAxis.setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
                   float re= value/ybl/10;
                String s = String.valueOf((int) Math.ceil(re)*10);
                return s;
            }
        });


        rightYAxis.setEnabled(false);


    }

    int color=Color.parseColor("#fa3434");

    public int getColor() {
        return color;
    }

    public void setColor(int color) {
        this.color = color;
    }

    /**
     * 功能：对图表中的曲线初始化，添加三条，并且默认显示第一条
     */
    void initLine() {

        mLineDataSet1.setHighLightColor(Color.parseColor("#6897BB"));
        mLineDataSet1.setDrawCircles(false);
        mLineDataSet1.setDrawHighlightIndicators(true);
        mLineDataSet1.setHighlightEnabled(true);
        mLineDataSet1.setDrawValues(false);
        //   mLineDataSet1.setCircleColor(Color.parseColor("#0B70B4"));
        mLineDataSet1.setDrawCircleHole(false);
        mLineDataSet1.setColor(color);//折线颜色
        mLineDataSet1.setMode(LineDataSet.Mode.CUBIC_BEZIER);

        createLine(mList1, mEntries1, mLineDataSet1, color, mLineData, mLineChart);


        for (int i = 0; i < mLineData.getDataSetCount(); i++) {
            mLineChart.getLineData().getDataSets().get(i).setVisible(false); //
        }
    }

    /**
     * 功能：根据索引显示或隐藏指定线条
     */
    public void showLine(int index) {
        mLineChart
                .getLineData()
                .getDataSets()
                .get(index)
                .setVisible(true);
        mLineChart.invalidate();
    }

    /**
     * 功能：动态创建一条曲线
     */
    private void createLine(List<Float> dataList, List<Entry> entries, LineDataSet lineDataSet, int color, LineData lineData, LineChart lineChart) {
        for (int i = 0; i < dataList.size(); i++) {

            Entry entry = new Entry(i, dataList.get(i));// Entry(x,y)
            entries.add(entry);
        }

        // 初始化线条
        initLineDataSet(lineDataSet, color, LineDataSet.Mode.CUBIC_BEZIER);

        if (lineData == null) {
            lineData = new LineData();
            lineData.addDataSet(lineDataSet);
            lineChart.setData(lineData);
        } else {
            lineChart.getLineData().addDataSet(lineDataSet);
        }

        lineChart.invalidate();
    }


    /**
     * 曲线初始化设置,一个LineDataSet 代表一条曲线
     *
     * @param lineDataSet 线条
     * @param color       线条颜色
     * @param mode
     */
    private void initLineDataSet(LineDataSet lineDataSet, int color, LineDataSet.Mode mode) {
        lineDataSet.setColor(color); // 设置曲线颜色
        lineDataSet.setCircleColor(color);  // 设置数据点圆形的颜色
        lineDataSet.setDrawCircleHole(false);// 设置曲线值的圆点是否是空心
        lineDataSet.setLineWidth(1f); // 设置折线宽度
        lineDataSet.setCircleRadius(3f); // 设置折现点圆点半径
        lineDataSet.setValueTextSize(10f);

//        lineDataSet.setDrawFilled(true); //设置折线图填充
        lineDataSet.setFormLineWidth(1f);
        lineDataSet.setFormSize(15.f);
        if (mode == null) {
            //设置曲线展示为圆滑曲线（如果不设置则默认折线）
            lineDataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);
        } else {
            lineDataSet.setMode(mode);
        }

    }


    /**
     * 功能：创建图例
     */
    private void createLegend(Legend legend) {
        /***折线图例 标签 设置***/
        Description description = new Description();
        legend.setEnabled(false);
        description.setEnabled(false);
        mLineChart.setDescription(description);
    }


    /**
     * 设置 可以显示X Y 轴自定义值的 MarkerView
     */
    public void setMarkerView(LineChart lineChart) {
        lineChart.invalidate();
    }


    /**
     * 动态添加数据
     * 在一个LineChart中存放的折线，其实是以索引从0开始编号的
     *
     * @param yValues y值
     */
    public void addEntry(LineData lineData, LineChart lineChart, List<Float> yValues, int index) {

        // 通过索引得到一条折线，之后得到折线上当前点的数量
        int xCount = lineData.getDataSetByIndex(index).getEntryCount();

        for (int i = 0; i < yValues.size(); i++) {
            Entry entry = new Entry(xCount + i, yValues.get(i)); // 创建一个点
            lineData.addEntry(entry, index); // 将entry添加到指定索引处的折线中
        }
        //通知数据已经改变
        lineData.notifyDataChanged();
        lineChart.notifyDataSetChanged();

        //把yValues移到指定索引的位置
        lineChart.moveViewTo(xCount - xNum + yValues.size(), yValues.get(yValues.size() - 1), YAxis.AxisDependency.LEFT);
        lineChart.invalidate();
    }


    /**
     * 功能：第1条折线添加一个点
     */
    public void addLine1Data(List<Float> yValues) {
        if (falg) {
            showLine(LINE_NUMBER_1);
            falg = false;
        }
        addEntry(mLineData, mLineChart, yValues, LINE_NUMBER_1);
    }

    /**
     * 功能：第1条折线添加一个点
     */
    public void addLine1Data(Float yValue) {

        List<Float> yValues = new ArrayList<>();
        yValues.add(yValue);
        if (falg) {
            showLine(LINE_NUMBER_1);
            falg = false;
        }
        addEntry(mLineData, mLineChart, yValues, LINE_NUMBER_1);
    }


}
